def genItemTime(ruleDatum, ruleAct, filterDatum, hsp_abbr):
    # 从filterDatum 获得 inOne
    inOne = filterDatum.get('in_one_', 'case')

    # 从filterDatum 获得 than
    than = filterDatum['than']
    if than in ('discharge_date', 'out_date', 'out_time', 'out'):
        thanKey = 'out'
        thanSql = "out_time"
        inOne = 'case'
    elif than in ('admission_date', 'in_date', 'in_time', 'in'):
        thanKey = 'in'
        thanSql = "in_time"
        inOne = 'case'
    elif than in ('first','first_time','first_used','first_used_time','first_date','first_used_date'):
        thanKey = 'first'

    # 从filterDatum获得 operator
    operator = filterDatum['operator']
    operSql = ""
    if operator == 'gt':
        operSql = ">"
    elif operator == 'lt':
        operSql = "<"
    elif operator == 'eq':
        operSql = "="
    elif operator == 'gte':
        operSql = ">="
    elif operator == 'lte':
        operSql = "<="
    else:
        raise ValueError(f"item time, Unsupported operator: {operator}")
    
    # 从filterDatum获得 plus, plus_unit（默认day，也可以是hour、minute）
    plus = filterDatum.get('plus', 0)
    plus_unit = filterDatum.get('plus_unit', 'day')

    """
    ============ 思路 ============
    1. 统计 va，与 m 表关联，关联 in_time 或者 out_time 或者 first_time，应用规则，将符合违规条件的数据放入 vb
    2. 删除 va 当中不在 vb 的数据（通过 d0_rowid）

    ============ 参数 ============
    ● operator：大于，小于，等于
    ● than：入院时间、出院时间、首次使用时间
    ● in_one_: case, patient, year
    ● plus：校准值
    ● plus_unit：校准单位
    """
    
    # sqlList
    sqlList = ["TRUNCATE TABLE vlt_tmp_b"]

    # 第一步
    if inOne == 'case' and thanKey in ('in', 'out'):
        # 第一步，如果是 in_one_ 是 case，且 in_time 或者 out_time
        sqlList.append(f"""
            -- item time in one case than in or out，step1a，统计 va，与 m 表关联，关联 in_time 或者 out_time，应用规则，将符合违规条件的数据放入 vb
            INSERT INTO vlt_tmp_b vb (d0_rowid, item_time, in_time, out_time)
            SELECT va.d0_rowid, va.item_time, m.in_time, m.out_time
            FROM vlt_tmp_a va, m
            WHERE va.setl_id = m.setl_id AND va.item_time {operSql} m.{thanSql} + NUMTODSINTERVAL({plus}, '{plus_unit.upper()}')
        """)
    elif inOne == 'case' and thanKey == 'first':
        # 第一步，如果是 in_one_ 是 case，且 first_time
        # 清空 vlt_tmp_b2
        sqlList.append("TRUNCATE TABLE vlt_tmp_b2")
        # 将 当前病例当中，每个项目的最早使用时间，放入 vlt_tmp_b2
        sqlList.append(f"""
            -- item time in one case first，step1a，统计 va，找出 va 中每个 setl_id 的每个 item_j_code 的项目最初发生时间，将这个发生时间放在 vb2 的 date1
            INSERT INTO vlt_tmp_b2 vb2 (setl_id, item_j_code, date1)
            SELECT va.setl_id, va.item_j_code, MIN(va.item_time) AS date1
            FROM vlt_tmp_a va
            GROUP BY va.setl_id, va.item_j_code
        """)
        # 将 va 关联 vb2，将符合违规条件的数据放入 vb
        sqlList.append(f"""
            -- item time in one case first，step1b，统计 vb2，关联 m，将符合违规条件的数据放入 vb
            INSERT INTO vlt_tmp_b vb (d0_rowid, item_time)
            SELECT va.d0_rowid, va.item_time
            FROM vlt_tmp_a va, vlt_tmp_b2 vb2
            WHERE va.setl_id = vb2.setl_id AND va.item_j_code = vb2.item_j_code
                AND va.item_time {operSql} vb2.date1 + NUMTODSINTERVAL({plus}, '{plus_unit.upper()}')
        """)
    elif inOne == 'year' and thanKey == 'first':
        # 第一步，如果是 in_one_ 是 year，且 first_time
        # 清空 vlt_tmp_b2
        sqlList.append("TRUNCATE TABLE vlt_tmp_b2")
        # 将 当前年份当中，每个项目的最早使用时间，放入 vlt_tmp_b2
        sqlList.append(f"""
            -- item time in one year first，step1a，统计 va，找出 va 中每个 psn_no 的每个 item_j_code 的项目最初发生时间，将这个发生时间放在 vb2 的 date1
            INSERT INTO vlt_tmp_b2 vb2 (psn_no, j_year, item_j_code, date1)
            SELECT va.psn_no, va.j_year, va.item_j_code, MIN(va.item_time) AS date1
            FROM vlt_tmp_a va
            GROUP BY va.psn_no, va.j_year, va.item_j_code
        """)
        # 将 vb 关联 vb2，将符合违规条件的数据放入 vb
        sqlList.append(f"""
            -- item time in one year first，step1b，统计 vb2，关联 m，将符合违规条件的数据放入 vb
            INSERT INTO vlt_tmp_b vb (d0_rowid, item_time)
            SELECT va.d0_rowid, va.item_time
            FROM vlt_tmp_a va, vlt_tmp_b2 vb2
            WHERE va.psn_no = vb2.psn_no AND va.j_year = vb2.j_year AND va.item_j_code = vb2.item_j_code
                AND va.item_time {operSql} vb2.date1 + NUMTODSINTERVAL({plus}, '{plus_unit.upper()}')
        """)
    elif inOne == 'patient' and thanKey == 'first':
        # 第一步，如果是 in_one_ 是 patient，且 first_time
        # 清空 vlt_tmp_b2
        sqlList.append("TRUNCATE TABLE vlt_tmp_b2")
        # 将 当前患者当中，每个项目的最早使用时间，放入 vlt_tmp_b2
        sqlList.append(f"""
            -- item time in one patient first，step1a，统计 va，找出 va 中每个 psn_no 的每个 item_j_code 的项目最初发生时间，将这个发生时间放在 vb2 的 date1
            INSERT INTO vlt_tmp_b2 vb2 (psn_no, item_j_code, date1)
            SELECT va.psn_no, va.item_j_code, MIN(va.item_time) AS date1
            FROM vlt_tmp_a va
            GROUP BY va.psn_no, va.item_j_code
        """)
        # 将 vb 关联 vb2，将符合违规条件的数据放入 vb
        sqlList.append(f"""
            -- item time in one patient first，step1b，统计 vb2，关联 m，将符合违规条件的数据放入 vb
            INSERT INTO vlt_tmp_b vb (d0_rowid, item_time)
            SELECT va.d0_rowid, va.item_time
            FROM vlt_tmp_a va, vlt_tmp_b2 vb2
            WHERE va.psn_no = vb2.psn_no AND va.item_j_code = vb2.item_j_code
                AND va.item_time {operSql} vb2.date1 + NUMTODSINTERVAL({plus}, '{plus_unit.upper()}')
        """)
    else:
        raise ValueError(f"item time, Unsupported in_one_ and than combination: {inOne}, {thanKey}")

    # 第二步，删除 va 当中不在 vb 的数据（通过 d0_rowid）
    sqlList.append(f"""
        DELETE FROM vlt_tmp_a va
        WHERE NOT EXISTS (
            SELECT 1 FROM vlt_tmp_b vb WHERE va.d0_rowid = vb.d0_rowid
        )
    """)

    return sqlList

def genItemFirstTime(ruleDatum, ruleAct, filterDatum, hsp_abbr):
    # 从filterDatum获得 than，只有 discharge_date, admission_date
    than = filterDatum['than']
    if than in ('discharge_date', 'discharge_time', 'out_date', 'out_time', 'out'):
        thanSql = "out_time"
    elif than in ('admission_date', 'admission_time', 'in_date', 'in_time', 'in'):
        thanSql = "in_time"
        
    # 从filterDatum获得 operator
    operator = filterDatum['operator']
    operSql = ""
    if operator == 'gt':
        operSql = ">"
    elif operator == 'lt':
        operSql = "<"
    elif operator == 'eq':
        operSql = "="
    elif operator == 'gte':
        operSql = ">="
    elif operator == 'lte':
        operSql = "<="
    else:
        raise ValueError(f"item first time, Unsupported operator: {operator}")
    
    # 从filterDatum获得 value, unit
    value = filterDatum.get('value', 0)
    unit = filterDatum.get('unit', 'hour')

    """
    ============ 思路 ============
    1. 统计 va，找出 va 中每个 setl_id 的每个 item_j_code 的项目最初发生时间，将这个发生时间放在 vb 的 date1
    2. 统计 vb，关联 m，将符合违规条件的数据放入 vb2
    3. 删除 va 中不在 vb2 的数据（通过 setl_id, item_j_code）
    4. 更新 va 的 related：项目最初发生时间：xxx。通过 vb 的 date1

    参数
    ● operator：大于，小于，等于
    ● than：入院时间、出院时间
    ● plus：校准值
    ● plus_unit：校准单位
    """
    
    sqlList = [
        # 清空临时表
        "TRUNCATE TABLE vlt_tmp_b",
        "TRUNCATE TABLE vlt_tmp_b2",
        # step1
        f"""
            -- item first time，step1，统计 va，找出 va 中每个 setl_id 的每个 item_j_code 的项目最初发生时间，将这个发生时间放在 vb 的 date1
            INSERT INTO vlt_tmp_b vb (setl_id, item_j_code, date1)
            SELECT va.setl_id, va.item_j_code, MIN(va.item_time) AS date1
            FROM vlt_tmp_a va
            GROUP BY va.setl_id, va.item_j_code
        """,
        # step2
        f"""
            -- item first time，step2，统计 vb，关联 m，将符合违规条件的数据放入 vb2
            INSERT INTO vlt_tmp_b2 vb2 (setl_id, item_j_code)
            SELECT vb.setl_id, vb.item_j_code
            FROM vlt_tmp_b vb, m
            WHERE vb.setl_id = m.setl_id
              AND vb.date1 {operSql} m.{thanSql} + NUMTODSINTERVAL({value}, '{unit.upper()}')
        """,
        # step3
        f"""
            -- item first time，step3，删除 va 中不在 vb2 的数据（通过 setl_id, item_j_code）
            DELETE FROM vlt_tmp_a va
            WHERE NOT EXISTS (
                SELECT 1 FROM vlt_tmp_b2 vb2 
                WHERE va.setl_id = vb2.setl_id AND va.item_j_code = vb2.item_j_code
            )
        """,
        # step4
        f"""
            -- item first time，step4，更新 va 的 related：项目最初发生时间：xxx。通过 vb 的 date1
            UPDATE vlt_tmp_a va
            SET va.related = '项目最初发生时间：' || (
                SELECT TO_CHAR(vb.date1, 'YYYY-MM-DD HH24:MI:SS')
                FROM vlt_tmp_b vb
                WHERE va.setl_id = vb.setl_id AND va.item_j_code = vb.item_j_code
            )
            WHERE EXISTS (
                SELECT 1 FROM vlt_tmp_b vb
                WHERE va.setl_id = vb.setl_id AND va.item_j_code = vb.item_j_code
            )
        """,
    ]

    return sqlList